#ifndef HYSTERESIS_THRESHOLD_OPERATOR_HPP
#define HYSTERESIS_THRESHOLD_OPERATOR_HPP

//------------------------------------------------------------------------------
// Fichier d'entête utilisés
//------------------------------------------------------------------------------
#include "Operator.hpp"
#include "GrayImage.hpp"
#include "BinaryImage.hpp"
#include "Region.hpp"
#include "ThresholdFinder.hpp"

namespace ImageAnalysis
{
//----------------------------------------------------------------------
// Cette classe permet d'appliquer le seuillage par hystérésis
// à une image gradiant pour la binariser. On passe en paramètre
// une méthode permettant de trouver les seuils, qui sont appliqués
// par cette classe.
//----------------------------------------------------------------------
class HysteresisThresholdOperator : public Operator
{
public:
		//----------------------------------------------------------------------
		// Structure
		//----------------------------------------------------------------------

		//----------------------------------------------------------------------
		// Constructeur
		//----------------------------------------------------------------------
		HysteresisThresholdOperator( Gradiant* gradiant, BinaryImage* thresholdedImage, ThresholdFinder* finder );

		//----------------------------------------------------------------------
		// Destructeur
		//----------------------------------------------------------------------
		virtual ~HysteresisThresholdOperator();

		//----------------------------------------------------------------------
		// Méthode permettant d'effectuer le seuillage par hystérésis
		//----------------------------------------------------------------------
		virtual void Process( );

private:
        //----------------------------------------------------------------------
		// Permet d'explorer les pixels au voisinage du pixel passé en paramètre
		// pour les comparer au seuil bas.
		//----------------------------------------------------------------------
        void ExploreNeighbor( int pixelIndex, int lowerThreshold );

        //----------------------------------------------------------------------
		// Applique le seuillage par hystérésis à l'image gradient
		// avec le seuil bas et le seuil haut passés en paramètre.
		// Contrat les seuils doivent être compris entre 0 et 255.
		//----------------------------------------------------------------------
        	void HysteresisTheshold( int lowerThreshold, int upperThreshold );

		//----------------------------------------------------------------------
		//
		//----------------------------------------------------------------------
		Gradiant* currentGradiant;
		BinaryImage* currentThresholdedImage;
		ThresholdFinder* thresholdFinder;

		//----------------------------------------------------------------------
		// Constructeur par copie et oprérateur d'affectation en privée pour
		// interdire leur utilisation
		//----------------------------------------------------------------------
		HysteresisThresholdOperator( const HysteresisThresholdOperator& copy);
		HysteresisThresholdOperator& operator=( const HysteresisThresholdOperator& copy );
};

}
#endif //HYSTERESIS_THRESHOLD_OPERATOR_HPP
